package com.me.web.server.netty.websocket;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import lombok.extern.slf4j.Slf4j;

/**
 * WebSocketHandler 类，继承自 SimpleChannelInboundHandler<TextWebSocketFrame>，用于处理 WebSocket 文本消息
 *1.2 创建一个 WebSocketHandler 继承自 SimpleChannelInboundHandler，用于处理 WebSocket 文本消息。
 * @author chenlei
 */
@Slf4j
public class NettyWebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
    /**
     * 处理接收到的消息
     *
     * @param ctx 通道处理上下文，包含了与通道相关的信息，如通道本身、管道等
     * @param msg 接收到的 TextWebSocketFrame 消息，包含了客户端发送的文本消息内容
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {
        String message = msg.text();
        // 接收到客户端消息时记录日志，使用 debug 级别，方便在生产环境中调整日志输出
        log.debug("收到客户端的消息: {}", message);
        // 将信息返回给客户端
        ctx.writeAndFlush(msg);
        // 回复消息示例（如果需要）
        // ctx.channel().writeAndFlush(new TextWebSocketFrame("服务器收到您的消息: " + message));
    }

    /**
     * 记录客户端的连接信息
     *
     * @param ctx 通道处理上下文
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        // 当有新的 WebSocket 客户端连接时记录日志
        log.info("一个新的 WebSocket 客户端已连接: {}", ctx.channel().remoteAddress());
    }

    /**
     * 当 WebSocket 客户端断开连接时调用此方法
     *
     * @param ctx 通道处理上下文
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        // 当 WebSocket 客户端断开连接时记录日志
        log.info("WebSocket 客户端已断开连接: {}", ctx.channel().remoteAddress());
    }

    /**
     * 当处理 WebSocket 连接过程中发生异常时调用此方法
     * 该方法主要负责记录异常信息，并关闭连接以防止异常扩散影响其他客户端
     *
     * @param ctx   通道处理上下文
     * @param cause 引发异常的原因，包含了异常的详细信息
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // 当处理过程中发生异常时记录日志
        log.error("WebSocket 连接中发生错误: {}", cause.getMessage());
        // 关闭连接以避免异常扩散影响其他客户端
        ctx.close();
    }
}

